﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class Animal
{
public:
	int m_Age;
};
//2.虚基类Sheep；
class Sheep :virtual public Animal
{

};
//3.虚基类Camel；
class Camel :virtual public Animal
{

};
class Alpaca :public Sheep, public Camel
{

};
//1.菱形继承的解决方案，利用虚继承；此时操作的是共享的一份数据，即Animal的m_Age；
void testDiamondExtends()
{
	Alpaca alpaca;
	alpaca.Sheep::m_Age = 10;
	alpaca.Camel::m_Age = 20;

	cout << alpaca.Sheep::m_Age << endl;//10 --> 20
	cout << alpaca.Camel::m_Age << endl;//20 --> 20

	//4.可以直接访问，原因是已经没有二义性的可能了，只有一份m_Age；
	cout << alpaca.m_Age << endl;//20

	//5.通过地址找到偏移量，内部工作原理；
	alpaca.m_Age = 30;
	//6.找到Sheep的偏移量操作；
	cout << *(int*)((int*)*(int*)&alpaca + 1) << endl;//8
	//7.找到Camel的偏移量；
	cout << *(int*)((int*)*((int*)&alpaca + 1) + 1) << endl;//4
	//8.输出m_Age；
	cout << ((Animal*)((char*)&alpaca + *(int*)((int*)*(int*)&alpaca + 1)))->m_Age << endl;//30
}

//main292：菱形继承的概念以及问题
int main292()
{
	testDiamondExtends();

	system("pause");
	return EXIT_SUCCESS;
}